package com.xzx.springbootredis.utils;

import com.google.gson.Gson;

import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
import java.util.Random;
import java.util.UUID;
import java.util.regex.Pattern;


public class Tool {

    // 当前时间戳（秒）
    public static int getCurrentTime() {
        return (int) Instant.now().getEpochSecond();
    }

    // 生成UUID
    public static UUID getUUID() {
        return UUID.randomUUID();
    }

    // 手机号码格式检查
    public static Boolean isMobile(String mobile) {
        String mobileRule = "^1[3-9]\\d{9}$";
        return Pattern.matches(mobileRule, mobile);
    }

    // 密码格式验证
    public static Boolean isValidPassword(String password) {
        String passwordRule = "^(?=.*[^\\d]).{8,}$";
        return Pattern.matches(passwordRule, password);
    }

    // 身份证格式验证
    public static Boolean isValidIdCard(String idCard) {
        String idCardRule = "^[1-9]\\d{5}(19|20)\\d{2}((0[1-9])|(1[0-2]))(([0-2][1-9])|10|20|30|31)\\d{3}[0-9Xx]$";
        return Pattern.matches(idCardRule, idCard);
    }

    /**
     * 生成指定位数的随机数字（首位不为0）
     * @param digits 位数（正整数）
     * @return 随机数字
     */
    public static long generateRandomNumber(int digits) {
        if (digits <= 0) {
            throw new IllegalArgumentException("位数必须为正整数");
        }
        long min = (long) Math.pow(10, digits - 1);
        long max = (long) Math.pow(10, digits) - 1;
        Random random = new Random();
        // 修正：通过无参nextLong() + 位运算 + 取模生成区间内随机数
        return min + (random.nextLong() & Long.MAX_VALUE) % (max - min + 1);
    }

    // 格式化当前时间（年月日时分秒）
    public static String getCurrentDate(String format) {
        LocalDateTime currentTime = LocalDateTime.now();
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(format);
        return currentTime.format(formatter);
    }

    // 时间戳转日期字符串
    public static String timeToDate(int timestampInSeconds) {
        Instant instant = Instant.ofEpochSecond(timestampInSeconds);
        ZoneId zoneId = ZoneId.of("Asia/Shanghai");
        LocalDate localDate = instant.atZone(zoneId).toLocalDate();
        return localDate.toString();
    }

    // 对象转JSON字符串
    public static String objToJson(Object obj) {
        Gson gson = new Gson();
        return gson.toJson(obj);
    }

    // JSON字符串转对象
    public static <T> T jsonToObj(String json, Class<T> clazz) {
        Gson gson = new Gson();
        return gson.fromJson(json, clazz);
    }
}